/*
 * 版权所有：杭州领域向尚科技有限公司
 * 地址：浙江省杭州市滨江区滨安路688号天和高科技产业园5-2311
 *
 * (c) Copyright Hangzhou  Area Up Technology Co., Ltd.
 */

package org.elanfox.intellicommunity.common.utils;

import org.springframework.util.DigestUtils;

import java.io.UnsupportedEncodingException;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Random;

/**
 * @author allan
 * @date 01/11/2017
 */
public class RandomUtils {
    public static final Random random = new Random();
    private static final String codeStr = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789abcdefghijklmnpqrstuvwxyz";

    /**
     * 根据位数生成随机码
     *
     * @param length 位数
     * @return
     * @author guomw
     */
    public static String randomString(int length) {
        StringBuilder retNum = new StringBuilder();
        for (int i = 0; i < length; i++) {
            retNum.append(codeStr.charAt(random.nextInt(codeStr.length())));
        }
        return retNum.toString();
    }

    /**
     * 产生在区间内的随机正整数，[min,max]
     *
     * @param min 最小数
     * @param max 最大数
     * @return 产生的随机数
     */
    public static int nextIntInSection(int min, int max) {
        if (min > max) {
            throw new IllegalStateException("最小数不能超过最大数");
        }
        return random.nextInt(max - min + 1) + min;
    }

    /**
     * 产生在区间内的随机小数, [min,max)
     *
     * @param min 最小数
     * @param max 最大数
     * @return 随机小数
     */
    public static double nextDoubleInSection(int min, int max) {
        if (min >= max) {
            throw new IllegalStateException("最小数必须小于最大数");
        }
        return random.nextDouble() * (max - min) + min;
    }

    /**
     * <p>位数不足无法保证其唯一性,需要客户端代码自行校验唯一性.</p>
     * <p>具体的区间是10000000000-19999999999</p>
     *
     * @return 获取一个随机的手机号码
     */
    public static String randomMobile() {
        String p1 = String.valueOf(100000 + random.nextInt(100000));
        //还有5位 而且必须保证5位
        String p2 = String.format("%05d", random.nextInt(100000));
        return p1 + p2;
    }


    /**
     * 得到流水号，默认20位，最少14位
     *
     * @param length 额外位数
     * @return
     */
    public static String randomFlowNo(int length) {
        String prefix = StringUtilsExt.dateFormat(new Date(), "yyyyMMddHHmmss");

        StringBuilder suffix = new StringBuilder();
        //随机产生后几位数字的字符串
        for (int i = 0; i < length; i++) {
            String rand = String.valueOf(random.nextInt(10));
            suffix.append(rand);
        }

        return prefix + suffix.toString();
    }

    public static String randomFlowNo() {
        return randomFlowNo(6);
    }

    /**
     * 随机一个时间
     *
     * @return
     */
    public static LocalDateTime randomDateTime() {
        LocalDateTime baseDateTime = LocalDateTime.now();

        return baseDateTime.minusDays(nextIntInSection(0, 180));
    }

    /**
     * 随机一个真或者假
     *
     * @return
     */
    public static boolean randomBoolean() {
        return nextIntInSection(0, 1) == 1;
    }

    /**
     * 生成邀请码
     *
     * @param len 长度
     * @return
     */
    public static String generateRandomStr(int len) {
        //字符源，去掉1和i ，0和o
        String generateSource = "23456789abcdefghgklmnpqrstuvwxyz";
        String rtnStr = "";
        for (int i = 0; i < len; i++) {
            //循环随机获得当次字符，并移走选出的字符
            String nowStr = String.valueOf(generateSource.charAt((int) Math.floor(Math.random() * generateSource.length())));
            rtnStr += nowStr;
            generateSource = generateSource.replaceAll(nowStr, "");
        }
        return rtnStr;
    }

    /**
     * 生成一个token
     *
     * @return
     */
    public static String generateToken() throws UnsupportedEncodingException {
        String str = randomFlowNo(6);
        //md5
        return DigestUtils.md5DigestAsHex(str.getBytes(StringUtilsExt.ENCODING_UTF8));
    }
}
